#   MODULE_NAME             模块名
#   MODULE_VERSION          模块版本号
#   MODULE_LABEL            模块的标签（唯一标识）
#   MODULE_NAME_UPPER       全大写的模块名
#   MODULE_TRANSIT_TIME     模块中转时间
#   MODULE_PACKAGE_DIR      模块包的目录
#   MODULE_TRANSIT_DIR      模块包中转目录
#   MODULE_RECYCLE_DIR      模块包的回收目录
#   MODULE_INSTALL_DIR      模块中转目录
#   MODULE_VERSION_FILE     模块版本号
#   MODULE_TRANSIT_THREAD   模块中转线程数

export  MODULE_NAME=$(echo    "$2" | sed 's#[/?]# #g' | awk '{print $1}')
export  MODULE_VERSION=$(echo "$2" | sed 's#[/?]# #g' | awk '{print $2}')
export  MODULE_TRAITS=$(echo  "$2" | sed 's#[/?]# #g' | awk '{print $3}')
export  MODULE_INSTALL_WAY=$("${DEVREPO}/pkgr" parse | grep -E '^MODULE_TRAIT\s+way\s+' | awk '{print $3}')
export  MODULE_INSTALL_TAG=$("${DEVREPO}/pkgr" parse | grep -E '^MODULE_TRAIT\s+tag\s+' | awk '{print $3}')
export  MODULE_LABEL="${MODULE_NAME}/${MODULE_VERSION}"
export  MODULE_DIR="${PKGREPO}/${MODULE_NAME}"
export  MODULE_NAME_UPPER=$(echo "${MODULE_NAME}" | tr '[:lower:]' '[:upper:]')
export  MODULE_PACKAGE_DIR="${PKGREPO}/${MODULE_NAME}/${MODULE_VERSION}"
export  MODULE_TRANSIT_THREAD=8
export  MODULE_TRANSIT_TIME=$(date "+%Y%m%d%H%M%S")
export  MODULE_TRANSIT_DIR="${DEVREPO}/.transit/transit-${MODULE_NAME}@${MODULE_VERSION}"
export  MODULE_RECYCLE_DIR="${DEVREPO}/.recycle/recycle-${MODULE_NAME}@${MODULE_VERSION}@${MODULE_TRANSIT_TIME}"
export  MODULE_INSTALL_DIR="${DEVREPO}/${MODULE_NAME}/${MODULE_VERSION}"
export  MODULE_VERSION_FILE="${MODULE_PACKAGE_DIR}/VERSION"

#   HOST_ARCH       主机硬件架构(x85_64、aarch64)
#   HOST_PLATFORM   主机内核(winnt、linux、darwin、msys)
export  HOST_ARCH=$(arch | tr '[:upper:]' '[:lower:]')
export  HOST_PLATFORM=$(uname -s | sed 's#^\([^-]\+\)-.*#\1#g' | tr '[:upper:]' '[:lower:]')
if   [[ "${HOST_PLATFORM}" == "mingw64_nt" ]]; then
    HOST_PLATFORM="msys"
elif [[ "${HOST_PLATFORM}" == "" ]]; then
    HOST_PLATFORM="winnt"
fi

if   [[ "${HOST_PLATFORM}" == "darwin" ]]; then
    if [[ "${HOST_ARCH}" == "i386" ]]; then
        HOST_ARCH="x86_64"
    fi
fi

#   备份指定的模块
function _framework_backup()
{
    #   如果 recycle 没有创建就创建一个
    if [[ ! -d "${DEVREPO}/.recycle" ]]; then
        mkdir -p    "${DEVREPO}/.recycle"
    fi

    #   删除太老的备份文件
    local removelist=$(find "${DEVREPO}/.recycle"  -name "recycle-${MODULE_NAME}@${MODULE_VERSION}@*" | sort -r | awk '{if(NR>=3) print}' | sort)
    for item in ${removelist} ; do
        rm -rf "${item}"
    done

    #   如果安装目录已经有了，那么执行下备份操作
    if [[ -d "${MODULE_INSTALL_DIR}" ]]; then
        mv -f "${MODULE_INSTALL_DIR}" "${MODULE_RECYCLE_DIR}"
    fi

    return  0
}

#   创建中转目录
function _framework_maketransit()
{
    #   如果构建目录已经存在，那么先尝试删掉
    if [[ -d "${MODULE_TRANSIT_DIR}" ]]; then
        #echo    "The transit directory is exists and remove it first: '${MODULE_TRANSIT_DIR}'"
        rm -rf  "${MODULE_TRANSIT_DIR}"
        if [[ -d "${MODULE_TRANSIT_DIR}" ]]; then
            echo    "Remove the transit directory failed, may not have permissions: '${MODULE_TRANSIT_DIR}'"
            return  1
        fi
    fi

    #   创建构建目录
    mkdir -p "${MODULE_TRANSIT_DIR}"
    if [[ ! -d "${MODULE_TRANSIT_DIR}" ]]; then
        echo    "Create the transit directory failed: '${MODULE_TRANSIT_DIR}'"
        return  1
    fi

    return  0
}

#   备份指定的模块
#   $1  unzip_package_file
#   $2  unzip_target_dir
function _framework_unzip()
{
    set -x
    if [[ $# -lt 2 ]]; then
        echo    "Missing parameter for 'unzip' subcommand"
        return  1
    fi

    local unzip_package_file="$1"
    local unzip_target_dir="$2"

    #   如果解压目标目录不存在就尝试创建该目录
    if [[ ! -d "${unzip_target_dir}" ]]; then
        mkdir -p "${unzip_target_dir}"
        if [[ ! -d "${unzip_target_dir}" ]]; then
            echo    "Create the unzip target directory failed: '${unzip_target_dir}'"
            return  1
        fi
    fi

    #   当指定的主包为一个或者多个横线时,不需要真的做解压操作
    if   [[ "${unzip_package_file}" =~ ^.*\/-+$ ]]; then
        echo    "Ignore package: '${unzip_package_file}'"
        return  0
    fi

    #   针对windows下的mingw平台
    if [[ "${HOST_PLATFORM}" == 'msys' ]]; then
        unzip_package_file=$(cygpath -u ${unzip_package_file})
    fi

    #   根据文件后缀采用不同的解压方式
    if   [[ "${unzip_package_file}" =~ ^.*\.tar\.gz$ ]]; then
        cd "${unzip_target_dir}" && tar xvfz "${unzip_package_file}"
        RESULT=$?
    elif [[ "${unzip_package_file}" =~ ^.*\.tar\.xz$ ]]; then
        cd "${unzip_target_dir}" && tar xvf  "${unzip_package_file}"
        RESULT=$?
    elif [[ "${unzip_package_file}" =~ ^.*\.tgz$ ]]; then
        cd "${unzip_target_dir}" && tar xvfz "${unzip_package_file}"
        RESULT=$?
    elif [[ "${unzip_package_file}" =~ ^.*\.tar$ ]]; then
        cd "${unzip_target_dir}" && tar xvf  "${unzip_package_file}"
        RESULT=$?
    elif [[ "${unzip_package_file}" =~ ^.*\.zip$ ]]; then
        cd "${unzip_target_dir}" && unzip    "${unzip_package_file}"
        RESULT=$?
    elif [[ "${unzip_package_file}" =~ ^.*\.7z$ ]]; then
        cd "${unzip_target_dir}" && 7za e   "${unzip_package_file}"
        RESULT=$?
    else
        echo    "Unsupported package format: '${unzip_package_file}'"
        return  1
    fi

    #   检查解压是否成功
    if [[ ${RESULT} -ne 0 ]]; then
        echo    "Decompress package failed(${RESULT}): '${unzip_package_file}' -> '${unzip_target_dir}'"
        return  1
    fi

    echo    "Decompress package success: '${unzip_package_file}' -> '${unzip_target_dir}'"
    return 0
}

#   $1 action
#   $...
function framework()
{
    local   action="$1"
    shift   1
    "_framework_${action}"    "$@"
    return  $?
}
export -f framework
